package com.google.code.jarquivoretorno.core;

import java.util.ArrayList;
import java.util.List;

import com.google.code.jarquivoretorno.layout.modelo.Campo;
import com.google.code.jarquivoretorno.layout.modelo.Layout;
import com.google.code.jarquivoretorno.layout.modelo.Secao;
import com.google.code.jarquivoretorno.ret.ArquivoRetorno;

/**
 * 
 * @since 02/02/2010 14:03:20
 * @author Rafael Freitas de Morais
 * 
 */
class ArquivoRetornoManagerImpl implements ArquivoRetornoManager {

	private List<ArquivoRetorno> arquivos = new ArrayList<ArquivoRetorno>();
	private StringBuilder arquivo = new StringBuilder();
	private Layout layout;
	private Secao secaoAtual;
	private int posAtual = -1;
	private int arqAtual = -1;

	public ArquivoRetornoManagerImpl(Layout layout,
			List<ArquivoRetorno> arquivos) {
		this.layout = layout;
		this.arquivos.addAll(arquivos);
		this.secaoAtual = getPrimeiraSecao();
	}

	@Override
	public String getValue(Campo campo) {
		return arquivo.substring(posAtual + campo.getDe() - 1, posAtual
				+ campo.getAte());
	}

	@Override
	public Secao getSecaoByName(String name) {
		for (Secao secao : layout.getSecoes()) {
			if (secao.getNomeSecao().equalsIgnoreCase(name)) {
				secaoAtual = secao;
				return secao;
			}
		}
		// Disparar exception informando que nao existe seção com o nome passado
		return null;
	}

	@Override
	public Campo getCampoByName(Secao secao, String nomeCampo) {
		for (Campo campo : secao.getCampos()) {
			if (campo.getNomeCampo().equalsIgnoreCase(nomeCampo)) {
				return campo;
			}
		}
		// TODO Disparar exception informando que nao existe campo com o nome
		// passado
		// TODO Verificar se secao faz parte do layout
		return null;
	}

	@Override
	public boolean readRecord() {
		if (posAtual == -1) {
			posAtual = 0;
		} else {
			int tmpPos = arquivo.indexOf(System.getProperty("line.separator"), posAtual);
			posAtual = tmpPos + 1;
			if (posAtual == arquivo.length()) {
				// Fim do arquivo
				return false;
			}
		}
		// Verifica se mudou a secao
		String identificarInicio = arquivo.substring(posAtual, posAtual + 1);
		if (!identificarInicio.equals(secaoAtual.getIdentificadorInicio())) {
			return false;
		}
		return true;
	}

	@Override
	public boolean nextArquivoRET() {
		if (arqAtual == (arquivos.size() - 1)) {
			return false;
		}
		arqAtual++;
		arquivo = arquivos.get(arqAtual).getConteudo();
		posAtual = -1;
		return true;
	}

	private Secao getPrimeiraSecao() {
		for (Secao secao : layout.getSecoes()) {
			if (secao.getOrdemSecao().equals("1")) {
				return secao;
			}
		}
		// TODO Dispara um exception. É obrigatorio ter uma seção com ordem
		// igual a 1 e ela deve ser a primeira
		return null;
	}
}
